﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

//int main()
//{
//	int arr[10] = { 1,2,3,4,5 };
//	printf("%p ", arr);
//	printf("%p ", &arr[0]);
//	printf("%p ", *arr);
//	return 0;
//}

//void bubble_sort(int arr[], int sz)
//{
//	int i = 0;
//	for (i = 0; i < sz - 1; i++)
//	{
//		int j = 0;
//		for (j = 0; j < sz -i-1 ;j++)
//		{
//			if (arr[j] > arr[j + 1])
//			{
//				int temp = arr[j];
//				arr[j] = arr[j + 1];
//				arr[j + 1] = temp;
//			}
//	   }
//	}
//}
//
//int main()
//{
//	int arr[10] = { 3,1,4,2,5,7,9,6,8,10 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	bubble_sort(arr, sz);
//	for (int i = 0; i < sz; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//	return 0;
//}

//int n = 10;
//00000000000000000000000000001010  10
//00000000000000000000000000010100  20

//int main()
//{
//	int n = 10;
//	printf("%d", n << 1);
//	return 0;
//}

//int n = 10;
//00000000000000000000000000001010  10
//00000000000000000000000000000101   5

//10000000000000000000000000001010  -10
//11111111111111111111111111110101   
//11111111111111111111111111110110   补码存放
//11111111111111111111111111111011   
//11111111111111111111111111111010
//10000000000000000000000000000101  -5原码显示

//int main()
//{
//	int n = -10;
//	printf("%d", n >> 1);
//	return 0;
//}


//int main()
//{
//	int num1 = 1;
//    //00000000000000000000000000000001
//	int num2 = 2;
//	//00000000000000000000000000000010
//	printf("%d", num1 & num2);
//	//00000000000000000000000000000001
//	//00000000000000000000000000000010
//	//00000000000000000000000000000000
//	printf("%d", num1 | num2);
//	//00000000000000000000000000000001
//	//00000000000000000000000000000010
//	//00000000000000000000000000000011  3
//	printf("%d", num1 ^ num2);
//	//00000000000000000000000000000001
//	//00000000000000000000000000000010
//	//00000000000000000000000000000011 3
//	return 0;
//}

//不能创建临时变量（第三个变量），实现两个数的交换。

//int main()
//{
//	int a = 10;
//	int b = 20;
//	//因为 a^a=0; a^0=a;
//	a = a ^ b;
//	b = a ^ b;//a^b^b=a;
//	a = a^b;//a ^ b^a ^ b^b;
//	printf("%d ", a);
//	printf("%d", b);
//	return 0;
//}


////求一个整数存储在内存中的二进制中1的个数。
////方法一：对每一位进行&1
//int main()
//{
//	int n = -1;
//	// 对每一位进行&1  10000000000000000000000000000001
//	//                 11111111111111111111111111111110
//	//                 11111111111111111111111111111111
//	int count = 0;
//	int i = 0;
//	for (i = 0; i < 32; i++)
//	{
//		if (n & (1 << i))
//			count++;
//	}
//	printf("%d", count);
//	return 0;
//}

////方法二：将n和n-1进行&
//int main()
//{
//	int n = -1;
//	// 对每一位进行&1  10000000000000000000000000000001
//	//                 11111111111111111111111111111110
//	//                 11111111111111111111111111111111
//	int count = 0;
//	int i = 0;
//	while (n)
//	{
//		count++;
//		n = n & (n - 1);
//	}
//	printf("%d", count);
//	return 0;
//}

//int main()
//{
//	int a = -10;
//	int* p = NULL;
//	printf("%d\n", !2);
//	printf("%d\n", !0);
//	a = -a;
//	p = &a;
//	printf("%d\n", sizeof(a));
//	printf("%d\n", sizeof(int));
//	printf("%d\n", sizeof a);//这样写行不行？
//
//	//printf("%d\n", sizeof int);//这样写行不行？
//
//	return 0;
//}

//void test1(int arr[])
//{
//	printf("%d\n", sizeof(arr));//(2)
//
//}
//
//void test2(char ch[])
//{
//	printf("%d\n", sizeof(ch));//(4)
//
//}
//
//int main()
//{
//	int arr[10] = { 0 };
//	char ch[10] = { 0 };
//	printf("%d\n", sizeof(arr));//(1)
//
//	printf("%d\n", sizeof(ch));//(3)
//
//	test1(arr);
//	test2(ch);
//	return 0;
//}

//int main()
//{
//	int a = 10;
//	int x = ++a;
//	//先对a进行自增，然后对使用a，也就是表达式的值是a自增之后的值。x为11。
//	int y = --a;
//	//先对a进行自减，然后对使用a，也就是表达式的值是a自减之后的值。y为10;
//	return 0;
//}


//int main()
//{
//	int i = 0, a = 0, b = 2, c = 3, d = 4;
//	i = a++ && ++b && d++;
//	//i = a++||++b||d++;
//	printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
//	return 0;
//}

//int main()
//{
//	int i = 0, a = 1, b = 2, c = 3, d = 4;
//	/*i = a++ && ++b && d++;*/
//	i = a++||++b||d++;
//	printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
//	return 0;
//}

//struct Stu
//
//{
//	char name[10];
//	int age;
//	char sex[5];
//	double score;
//};
//
//void set_age1(struct Stu stu)
//{
//		stu.age = 18;
//}
//
//	void set_age2(struct Stu* pStu)
//	{
//		pStu->age = 18;//结构成员访问
//
//	}
//
//	int main()
//	{
//		struct Stu stu;
//		struct Stu* pStu = &stu;//结构成员访问
//
//
//		stu.age = 20;//结构成员访问
//
//		set_age1(stu);
//
//		pStu->age = 20;//结构成员访问
//
//		set_age2(pStu);
//		return 0;
//	}

//符和短整型操作数在使用之前被转换为普通整型，这种转换称为整型提升。
//int main()
//{
//	char a = 0xb6;
//	short b = 0xb600;
//	int c = 0xb6000000;
//	if (a == 0xb6)
//		printf("a");
//	if (b == 0xb600)
//		printf("b");
//	if (c == 0xb6000000)
//		printf("c");
//	return 0;
//}

//int main()
//{
//	char c = 1;
//	printf("%u\n", sizeof(c));
//	printf("%u\n", sizeof(+c));
//	printf("%u\n", sizeof(-c));
//	return 0;
//	//c只要参与表达式运算,就会发生整形提升,表达式 +c ,就会发生提升,所以 sizeof(+c) 是4个字
//	//节.表达式 - c 也会发生整形提升, 所以 sizeof(-c) 是4个字节, 但是 sizeof(c), 就是1个字节
//}
//
//int main()
//{
//	int n = 10;
//	char* pc = (char*)&n;
//	int* pi = &n;
//
//	printf("%p\n", &n);
//	printf("%p\n", pc);
//	printf("%p\n", pc + 1);
//	printf("%p\n", pi);
//	printf("%p\n", pi + 1);
//	return 0;
//}

//int main()
//{
//	int n = 0x11223344;
//	char* pc = (char*)&n;
//	int* pi = &n;
//	*pc = 0;
//	*pi = 0;
//	return 0;
//}

//int main()
//{
//	int* p;//局部变量指针未初始化，默认为随机值
//
//	*p = 20;
//	return 0;
//}

//int main()
//{
//	int* p = NULL;
//	//....
//	int a = 10;
//	p = &a;
//	if (p != NULL)
//	{
//		*p = 20;
//	}
//	return 0;
//}
//
//#define N_VALUES 5
//int main()
//{
//
//	float values[N_VALUES];
//
//	float* vp;
//
//	//指针+-整数；指针的关系运算
//
//	for (vp = &values[0]; vp < &values[N_VALUES];)
//	{
//		*vp++ = 0;
//	}
//}

//int my_strlen(char* s)
//{
//	char* p = s;
//	while (*p != '\0')
//		p++;
//	return p - s;
//}
//
//int main()
//{
//	char arr[10] = "haha";
//	int len = my_strlen(arr);
//	printf("%d", len);
//	return 0;
//}

//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,0 };
//	printf("%p\n", arr);
//	printf("%p\n", &arr[0]);
//	return 0;
//}

//int main()
//{
//	int arr[] = { 1,2,3,4,5,6,7,8,9,0 };
//	int* p = arr; //指针存放数组首元素的地址
//  int sz = sizeof(arr) / sizeof(arr[0]);
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		printf("&arr[%d] = %p   <====> p+%d = %p\n", i, &arr[i], i, p + i);
//	}
//	return 0;
//}

//int main()
//{
//	int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
//	int* p = arr; //指针存放数组首元素的地址
//
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", *(p + i));
//	}
//	return 0;
//}

//int main()
//{
//	int arr[10] = { 1,2,3,4,5 };
//	int* p = &arr;
//	for (int i = 0; i < 10; i++)
//	{
//      // printf("%p\n", p + i);
//	 //printf("%p\n", &arr[i]);
//	/*	printf("%d ", *(p + i));
//		printf("%d ", arr[i]);
//		printf("%d ", *(arr+i));*/
//	/*	printf("%d ", *(i + arr));
//		printf("%d ", i[arr]);*/
//	}
//	return 0;
//	
//}


//struct S
//{
//	int data[1000];
//	int num;
//};
//
//struct S s = { {1,2,3,4}, 1000 };
//
////结构体传参
//
//void print1(struct S s)
//{
//	printf("%d\n", s.num);
//}
//
////结构体地址传参
//
//void print2(struct S* ps)
//{
//	printf("%d\n", ps->num);
//}
//
//int main()
//{
//	print1(s);
//
//	print2(&s); //传地址
//
//	return 0;
//}

//int main()
//{
//	int i = 0;
//	int sum = 0;//保存最终结果
//	int n = 0;
//	int ret = 1;//保存n的阶乘
//	scanf("%d", &n);
//	for (i = 1; i <= n; i++)
//	{
//		int j = 0;
//		ret = 1;
//		for (j = 1; j <= i; j++)
//		{
//			ret *= j;
//		}
//		sum += ret;
//	}
//	printf("%d\n", sum);
//	return 0;
//}


//int main()
//{
//	int n = 0;//3!=1+2+6=9;4!=9+24=33
//	scanf("%d", &n);
//	int i = 0;
//	int rent = 1;
//	int sum = 0;
//	for (i = 1; i <=n; i++)
//	{
//		rent*= i;
//		sum += rent;
//	}
//	printf("%d", sum);
//	return 0;
//}

//void test1()
//{
//	int n = 10;
//	int m = 20;
//	int* p = &n;
//	*p = 20;//ok?
//
//	p = &m; //ok?
//
//}
//
//void test2()
//{
//	//代码2
//
//	int n = 10;
//	int m = 20;
//	const int* p = &n;
//	*p = 20;//ok?
//
//	p = &m; //ok?
//
//}
//
//void test3()
//{
//	int n = 10;
//	int m = 20;
//	int* const p = &n;
//	*p = 20;
//	p = &m;
//
//}
//
//int main()
//{
//	//测试无cosnt的
//
//	test1();
//	//测试const放在*的左边
//
//	test2();
//	//测试const放在*的右边
//
//	test3();
//	return 0;
//}


